
    /**  
    * @Title: ArithUtil.java
    * @Package com.util.bigdecimal
    * @Description: 
    * @author likai
    * @date 2017年12月28日
    * @version V1.0  
    */
    
package com.utils.bigdecimal;

import java.math.BigDecimal;

/**
    * @ClassName: ArithUtil
    * @Description: 提供精确的浮点数运算(包括加、减、乘、除、四舍五入)工具类 
    * @author likai
    * @date 2017年12月28日
    *
    */

public class BigdecimalUtil {
	/*
	 * new BigDecimal(double d); //不允许使用
	 * new BigDecimal(String s); //常用,推荐使用
	 * BigDecimal.valueOf(double d); //常用,推荐使用
	 */	
	
	// 除法运算默认精度  
    private static final int DEF_DIV_SCALE = 2;  
  
    private BigdecimalUtil() {  
  
    }  
  
    /** 
     * 精确加法 
     */  
    public static double add(double value1, double value2) {  
        BigDecimal b1 = BigDecimal.valueOf(value1);  
        BigDecimal b2 = BigDecimal.valueOf(value2);  
        return b1.add(b2).doubleValue();  
    }  
  
    /** 
     * 精确减法 
     */  
    public static double sub(double value1, double value2) {  
        BigDecimal b1 = BigDecimal.valueOf(value1);  
        BigDecimal b2 = BigDecimal.valueOf(value2);  
        return b1.subtract(b2).doubleValue();  
    }  
  
    /** 
     * 精确乘法 
     */  
    public static double mul(double value1, double value2) {  
        BigDecimal b1 = BigDecimal.valueOf(value1);  
        BigDecimal b2 = BigDecimal.valueOf(value2);  
        return b1.multiply(b2).doubleValue();  
    }  
  
    /** 
     * 精确除法 使用默认精度 
     */  
    public static double div(double value1, double value2)  {  
        return div(value1, value2, DEF_DIV_SCALE);  
    }  
  
    /** 
     * 精确除法 ,四舍五入
     * @param scale 精度 
     */  
    public static double div(double value1, double value2, int scale){  
 
        BigDecimal b1 = BigDecimal.valueOf(value1);  
        BigDecimal b2 = BigDecimal.valueOf(value2);  
        // return b1.divide(b2, scale).doubleValue();  
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();  
    }  
    
    /** 
     * 精确除法
     * @param scale 精度 
     */  
    public static double div(double value1, double value2, int scale,int ROUND_TYPE){  
 
        BigDecimal b1 = BigDecimal.valueOf(value1);  
        BigDecimal b2 = BigDecimal.valueOf(value2);  
        // return b1.divide(b2, scale).doubleValue();  
        return b1.divide(b2, scale, ROUND_TYPE).doubleValue();  
    } 
  
    /** 
     * 四舍五入 
     * @param scale 小数点后保留几位 
     */  
    public static double rounds(double v, int scale) {  
        return div(v, 1, scale);  
    }  
      
    /** 
     * 比较大小 
     */  
    public static boolean equalTo(BigDecimal b1, BigDecimal b2) {  
        if(b1 == null || b2 == null) {  
            return false;  
        }  
        return 0 == b1.compareTo(b2);  
    }  
}
